import { defineConfig, PluginOption } from "vite";
import vue from "@vitejs/plugin-vue";
import { resolve } from "path";
import UnoCSS from "unocss/vite";
import AutoImport from "unplugin-auto-import/vite";
import Components from "unplugin-vue-components/vite";
import { ElementPlusResolver } from "unplugin-vue-components/resolvers";
import Icons from "unplugin-icons/vite";
import IconsResolver from "unplugin-icons/resolver";

const pathSrc = resolve(__dirname, "src");

// https://vite.dev/config/
export default defineConfig({
  resolve: {
    alias: {
      "@": pathSrc,
    },
  },
  css: {
    modules: {
      localsConvention: "camelCase", // 支持驼峰式变量名
    },
    preprocessorOptions: {
      // 定义全局 SCSS 变量
      scss: {
        additionalData: `@use "@/styles/variables.scss" as *;`,
      },
    },
  },
  server: {
    port: 3000,
    open: true,
    proxy: {
      "/api": {
        target: "http://localhost:8000",
        changeOrigin: true,
        rewrite: (path) => path.replace(/^\/api/, ""),
      },
    },
  },

  plugins: [
    vue(),
    UnoCSS({
      configFile: "../uno.config.ts",
    }),
    // API 自动导入
    AutoImport({
      // 导入 Vue 函数，如：ref, reactive, toRef 等
      imports: ["vue", "@vueuse/core", "pinia", "vue-router", "vue-i18n"],
      resolvers: [
        // 导入 Element Plus函数，如：ElMessage, ElMessageBox 等
        ElementPlusResolver({ importStyle: "sass" }),
      ],
      eslintrc: {
        enabled: false,
        filepath: "./.eslintrc-auto-import.json",
        globalsPropValue: true,
      },
      vueTemplate: true,
      // 导入函数类型声明文件路径 (false:关闭自动生成)
      dts: false,
      // dts: "src/types/auto-imports.d.ts",
    }),
    // 组件自动导入
    Components({
      resolvers: [
        // 导入 Element Plus 组件
        ElementPlusResolver({ importStyle: "sass" }),
        IconsResolver({
          enabledCollections: ["ep"], // element-plus图标库，其他图标库 https://icon-sets.iconify.design/
        }),
      ],
      // 指定自定义组件位置(默认:src/components)
      dirs: ["src/components", "src/**/components"],
      // 导入组件类型声明文件路径 (false:关闭自动生成)
      dts: false,
      // dts: "src/types/components.d.ts",
    }),
    Icons({
      // 自动安装图标库
      autoInstall: true,
    }),
  ] as PluginOption[],
  // 预加载项目必需的组件
  optimizeDeps: {
    include: [
      "vue",
      "vue-router",
      "element-plus",
      "pinia",
      "axios",
      "@vueuse/core",
      "codemirror-editor-vue3",
      "default-passive-events",
      "exceljs",
      "path-to-regexp",
      "echarts/core",
      "echarts/renderers",
      "echarts/charts",
      "echarts/components",
      "vue-i18n",
      "nprogress",
      "sortablejs",
      "qs",
      "path-browserify",
      "@stomp/stompjs",
      "@element-plus/icons-vue",
      "element-plus/es",
      "element-plus/es/locale/lang/en",
      "element-plus/es/locale/lang/zh-cn",
      "element-plus/es/components/alert/style/index",
      "element-plus/es/components/avatar/style/index",
      "element-plus/es/components/backtop/style/index",
      "element-plus/es/components/badge/style/index",
      "element-plus/es/components/base/style/index",
      "element-plus/es/components/breadcrumb-item/style/index",
      "element-plus/es/components/breadcrumb/style/index",
      "element-plus/es/components/button/style/index",
      "element-plus/es/components/card/style/index",
      "element-plus/es/components/cascader/style/index",
      "element-plus/es/components/checkbox-group/style/index",
      "element-plus/es/components/checkbox/style/index",
      "element-plus/es/components/col/style/index",
      "element-plus/es/components/color-picker/style/index",
      "element-plus/es/components/config-provider/style/index",
      "element-plus/es/components/date-picker/style/index",
      "element-plus/es/components/descriptions-item/style/index",
      "element-plus/es/components/descriptions/style/index",
      "element-plus/es/components/dialog/style/index",
      "element-plus/es/components/divider/style/index",
      "element-plus/es/components/drawer/style/index",
      "element-plus/es/components/dropdown-item/style/index",
      "element-plus/es/components/dropdown-menu/style/index",
      "element-plus/es/components/dropdown/style/index",
      "element-plus/es/components/empty/style/index",
      "element-plus/es/components/form-item/style/index",
      "element-plus/es/components/form/style/index",
      "element-plus/es/components/icon/style/index",
      "element-plus/es/components/image-viewer/style/index",
      "element-plus/es/components/image/style/index",
      "element-plus/es/components/input-number/style/index",
      "element-plus/es/components/input-tag/style/index",
      "element-plus/es/components/input/style/index",
      "element-plus/es/components/link/style/index",
      "element-plus/es/components/loading/style/index",
      "element-plus/es/components/menu-item/style/index",
      "element-plus/es/components/menu/style/index",
      "element-plus/es/components/message-box/style/index",
      "element-plus/es/components/message/style/index",
      "element-plus/es/components/notification/style/index",
      "element-plus/es/components/option/style/index",
      "element-plus/es/components/pagination/style/index",
      "element-plus/es/components/popover/style/index",
      "element-plus/es/components/progress/style/index",
      "element-plus/es/components/radio-button/style/index",
      "element-plus/es/components/radio-group/style/index",
      "element-plus/es/components/radio/style/index",
      "element-plus/es/components/row/style/index",
      "element-plus/es/components/scrollbar/style/index",
      "element-plus/es/components/select/style/index",
      "element-plus/es/components/skeleton-item/style/index",
      "element-plus/es/components/skeleton/style/index",
      "element-plus/es/components/step/style/index",
      "element-plus/es/components/steps/style/index",
      "element-plus/es/components/sub-menu/style/index",
      "element-plus/es/components/switch/style/index",
      "element-plus/es/components/tab-pane/style/index",
      "element-plus/es/components/table-column/style/index",
      "element-plus/es/components/table/style/index",
      "element-plus/es/components/tabs/style/index",
      "element-plus/es/components/tag/style/index",
      "element-plus/es/components/text/style/index",
      "element-plus/es/components/time-picker/style/index",
      "element-plus/es/components/time-select/style/index",
      "element-plus/es/components/timeline-item/style/index",
      "element-plus/es/components/timeline/style/index",
      "element-plus/es/components/tooltip/style/index",
      "element-plus/es/components/tree-select/style/index",
      "element-plus/es/components/tree/style/index",
      "element-plus/es/components/upload/style/index",
      "element-plus/es/components/watermark/style/index",
    ],
  },
});
